HAL I3C initialization and configuration functions migration ¶
The goal of this page is to show how to migrate the initialization sequence using STM32CubeMX2:
Open STM32CubeMX2 I3C configuration panel.
Configure the SW layer HAL.
Configure the main I3C features.
Configure the additional I3C features if needed.
Configure the I3C DMA(s) if the application requires the I3C to be used in DMA mode.
Configure the NVIC if the application requires the I3C to be used in IT mode.
Generate the code.
Note
The configuration below might vary from a series to another.
HAL I3C configuration panel ¶
Create a new project with the STM32CubeMX2, then start the initialization and the main configuration.
HAL I3C main features configuration ¶
Configure the I3C main features.
HAL I3C advanced features configuration ¶
Configure the advanced I3C features.
GPIO configuration ¶
Configure GPIO pins.
DMA configuration ¶
Configure the DMA for data reception as needed.
DMA TX configuration ¶
DMA RX configuration ¶
DMA TC configuration ¶
NVIC configuration ¶
Configure the NVIC in case of an interrupt.
Generated I3C initialization and de-initialization sequences ¶
The I3C initialization sequence is generated in the
mx_i3c1_hal_init
function in
mx_i3c1.c
file under
$YOUR_PROJECT_NAME$/$YOUR_PROJECT_NAME$_SW/generated/STM32Cube_CodeGen.
Related concepts:
|
Topic |
Code Snippet HAL1 |
Code Snippet HAL2 |
|---|---|---|
|
Handle declaration |
I3C_HandleTypeDef hi3c1;
|
static hal_i3c_handle_t hI3C1;
|
|
Initialization and configuration sequence |
static void MX_I3C1_Init(void)
{
I3C_FifoConfTypeDef sFifoConfig = {0};
I3C_TgtConfTypeDef sTgtConfig = {0};
hi3c1.Instance = I3C1;
hi3c1.Mode = HAL_I3C_MODE_TARGET;
hi3c1.Init.TgtBusCharacteristic.BusAvailableDuration = 0x1e;
if (HAL_I3C_Init(&hi3c1) != HAL_OK)
{
Error_Handler();
}
sFifoConfig.RxFifoThreshold = HAL_I3C_RXFIFO_THRESHOLD_1_4;
sFifoConfig.TxFifoThreshold = HAL_I3C_TXFIFO_THRESHOLD_1_4;
sFifoConfig.ControlFifo = HAL_I3C_CONTROLFIFO_DISABLE;
sFifoConfig.StatusFifo = HAL_I3C_STATUSFIFO_DISABLE;
if (HAL_I3C_SetConfigFifo(&hi3c1, &sFifoConfig) != HAL_OK)
{
Error_Handler();
}
sTgtConfig.Identifier = 0;
sTgtConfig.MIPIIdentifier = 0;
sTgtConfig.CtrlRoleRequest = DISABLE;
sTgtConfig.HotJoinRequest = DISABLE;
sTgtConfig.IBIRequest = DISABLE;
sTgtConfig.IBIPayload = DISABLE;
sTgtConfig.IBIPayloadSize = HAL_I3C_PAYLOAD_1_BYTE;
sTgtConfig.MaxReadDataSize = 0;
sTgtConfig.MaxWriteDataSize = 0;
sTgtConfig.CtrlCapability = DISABLE;
sTgtConfig.GroupAddrCapability = DISABLE;
sTgtConfig.DataTurnAroundDuration = HAL_I3C_TURNAROUND_TIME_TSCO_LESS_12NS;
sTgtConfig.MaxReadTurnAround = 0;
sTgtConfig.MaxDataSpeed = HAL_I3C_GETMXDS_FORMAT_1;
sTgtConfig.MaxSpeedLimitation = DISABLE;
sTgtConfig.HandOffActivityState = HAL_I3C_HANDOFF_ACTIVITY_STATE_0;
sTgtConfig.HandOffDelay = DISABLE;
sTgtConfig.PendingReadMDB = DISABLE;
if (HAL_I3C_Tgt_Config(&hi3c1, &sTgtConfig) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
}
void HAL_I3C_MspInit(I3C_HandleTypeDef* hi3c)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
if(hi3c->Instance==I3C1)
{
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I3C1;
PeriphClkInitStruct.I3c1ClockSelection = RCC_I3C1CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
__HAL_RCC_I3C1_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF2_I3C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_NVIC_SetPriority(I3C1_EV_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(I3C1_EV_IRQn);
}
}
|
hal_i3c_handle_t *mx_i3c1_hal_init(void)
{
if (HAL_I3C_Init(&hI3C1, HAL_I3C1) != HAL_OK)
{
return NULL;
}
HAL_RCC_I3C1_EnableClock();
if (HAL_RCC_I3C1_SetKernelClkSource(HAL_RCC_I3C1_CLK_SRC_PCLK1) != HAL_OK)
{
return NULL;
}
hal_i3c_ctrl_config_t i3c_ctrl_config;
i3c_ctrl_config.timing_reg0 = 0x120101UL;
i3c_ctrl_config.timing_reg1 = 0xA002EUL;
if (HAL_I3C_CTRL_SetConfig(&hI3C1, &i3c_ctrl_config) != HAL_OK)
{
return NULL;
}
HAL_RCC_GPIOA_EnableClock();
HAL_RCC_GPIOB_EnableClock();
hal_gpio_config_t gpio_config;
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_NO;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_HIGH;
gpio_config.alternate = HAL_GPIO_AF_2;
HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_9, &gpio_config);
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_NO;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_HIGH;
gpio_config.alternate = HAL_GPIO_AF_3;
HAL_GPIO_Init(HAL_GPIOB, HAL_GPIO_PIN_5, &gpio_config);
/* Enable the Event interruption for I3C1 */
HAL_CORTEX_NVIC_SetPriority(I3C1_EV_IRQn, HAL_CORTEX_NVIC_PREEMP_PRIORITY_0, HAL_CORTEX_NVIC_SUB_PRIORITY_0);
HAL_CORTEX_NVIC_EnableIRQ(I3C1_EV_IRQn);
/* Enable the Error interrupt for I3C1 */
HAL_CORTEX_NVIC_SetPriority(I3C1_ERR_IRQn, HAL_CORTEX_NVIC_PREEMP_PRIORITY_0, HAL_CORTEX_NVIC_SUB_PRIORITY_0);
HAL_CORTEX_NVIC_EnableIRQ(I3C1_ERR_IRQn);
return &hI3C1;
}
|
|
Deinitialization sequence |
void MX_I3C_DeInit(void)
{
if (HAL_I3C_DeInit(&hI3C1) != HAL_OK)
{
Error_Handler();
}
}
void HAL_I3C_MspDeInit(I3C_HandleTypeDef* hi3c)
{
if(hi3c->Instance==I3C1)
{
__HAL_RCC_I3C1_CLK_DISABLE();
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_9|GPIO_PIN_8);
HAL_NVIC_DisableIRQ(I3C1_EV_IRQn);
}
}
|
void mx_i3c1_hal_deinit(void)
{
HAL_CORTEX_NVIC_DisableIRQ(I3C1_EV_IRQn);
HAL_CORTEX_NVIC_DisableIRQ(I3C1_ERR_IRQn);
(void)HAL_I3C_DeInit(&hI3C1);
HAL_RCC_I3C1_Reset();
HAL_RCC_I3C1_DisableClock();
HAL_GPIO_DeInit(HAL_GPIOA, HAL_GPIO_PIN_9);
HAL_GPIO_DeInit(HAL_GPIOB, HAL_GPIO_PIN_5);
}
|
|
IRQ handle function |
void I3C1_EV_IRQHandler(void)
{
HAL_I3C_EV_IRQHandler(&hi3c1);
}
void I3C1_ER_IRQHandler(void)
{
HAL_I3C_ER_IRQHandler(&hi3c1);
}
|
void I3C1_EV_IRQHandler(void)
{
HAL_I3C_EV_IRQHandler(&hI3C1);
}
void I3C1_ERR_IRQHandler(void)
{
HAL_I3C_ERR_IRQHandler(&hI3C1);
}
|